package com.baseframe.oss.template;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.baseframe.oss.entity.Oss;
import com.baseframe.oss.entity.OssFile;
import lombok.extern.slf4j.Slf4j;

import java.io.InputStream;



@Slf4j
public class AliOssTemplate extends AbstractOssTemplate{
    private OSSClient ossClient;
    public AliOssTemplate(Oss oss) {
        super(oss);
        init();
    }

    private void init(){
        ClientConfiguration conf = new ClientConfiguration();
        // 设置OSSClient允许打开的最大HTTP连接数，默认为1024个。
        conf.setMaxConnections(1024);
        // 设置Socket层传输数据的超时时间，默认为50000毫秒。
        conf.setSocketTimeout(50000);
        // 设置建立连接的超时时间，默认为50000毫秒。
        conf.setConnectionTimeout(50000);
        // 设置从连接池中获取连接的超时时间（单位：毫秒），默认不超时。
        conf.setConnectionRequestTimeout(1000);
        // 设置连接空闲超时时间。超时则关闭连接，默认为60000毫秒。
        conf.setIdleConnectionTime(60000);
        // 设置失败请求重试次数，默认为3次。
        conf.setMaxErrorRetry(5);

        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(getOss().getAccessKey(),getOss().getSecretKey());

        ossClient = new OSSClient(getOss().getEndpoint(), credentialsProvider, conf);


    }

    @Override
    public OssFile putFile(String originalName, InputStream inputStream) {
        //获取文件大小
        int fileSize = getFileSize(inputStream);
        //封装文件名

        String fileName = getFileName(originalName);
        String fileKey = getFileKey(fileName);
        //推送文件
        ossClient.putObject(getOss().getBucketName(),fileKey,inputStream);

        //封装文件对象
        OssFile ossFile = new OssFile();
        ossFile.setOriginalFilename(originalName);
        ossFile.setFilename(fileName);
        ossFile.setLink(getFileLink(fileKey));
        ossFile.setSize(String.valueOf(fileSize));
        ossFile.setKey(fileKey);

        return ossFile;

    }

    @Override
    public boolean DeleteFile(String fileKey) {
        try {
            ossClient.deleteObject(getOss().getBucketName(),fileKey);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public String getFileLink(String fileKey) {
        String https = "https://";
        String bucketName = getOss().getBucketName();
        //https://oss-cn-guangzhou.aliyuncs.com/upload/20230220/xxxxx.txt
        String endpoint = getOss().getEndpoint().substring(https.length());

        return https+bucketName.concat(".").concat(endpoint).concat("/").concat(fileKey);
    }







}
